#include "SeqString.h"


/**
 * 初始化串
 * @param str 传递地址方便改变
 */
void InitSting_HeapString(HString *str) {
    /* 数组赋值为空 */
    str->ch = NULL;
    /* 数组长度置为 0 */
    str->length = 0;
}


/**
 * 为串 str 赋值,值为字符串常量 chars
 * @param str
 * @param chars
 * @return
 */
Status StrAssign_HeapString(HString *str, char *chars) {
    /* 获取字符串长度 */
    int len = strlen(chars);
    /* 如果字符串长度为 0 */
    if (!len) {
        return ERROR;
    }
    /* 堆字符串初始化 */
    InitSting_HeapString(str);
    /* 为当前分配空间 */
    str->ch = (char *) malloc(len * sizeof(char));

    /* 判断分配状态 */
    if (!str->ch) {
        /* 内存溢出 */
        exit(OVERFLOW);
    } else {
        /* 为每一个元素赋值 */
        for (int i = 0; i < len; i++) {
            str->ch[i] = chars[i];
        }
        str->length = len;
    }


    return OK;
}


/**
 * 打印堆字符串
 * @param str
 */
void PrintHeapString(HString *str) {
    if (!str->ch || str->length == 0) {
        printf("堆字符串为空!\n");
        return;
    }

    /* 逐字输出 */
    for (int i = 0; i < str->length; i++) {
        printf("%c\t", str->ch[i]);
    }

}


/**
 * 将串 srcStr 中的内容复制到 destStr中
 * @param destStr
 * @param srcStr
 * @return
 */
Status StrCopy_HeapString(HString *destStr, HString *srcStr) {
    InitSting_HeapString(destStr);

    if (IsEmpty_HeapString(srcStr)) {
        printf("要复制的字符串 srcStr不能为空!\n");
        return ERROR;
    }

    destStr->ch = (char *) malloc(sizeof(char) * srcStr->length);

    if (!destStr->ch) {
        exit(OVERFLOW);
    }
    for (int i = 0; i < srcStr->length; i++) {
        destStr->ch[i] = srcStr->ch[i];
    }
    destStr->length = srcStr->length;

    return OK;
}

/**
 * 判空
 * @param str
 * @return
 */
Status IsEmpty_HeapString(HString *str) {
    if (str->length == 0 || !str->ch) {
        return TRUE;
    }
    return FALSE;
}


/**
 * 比较两个堆字符串的大小
 * @param str1
 * @param str2
 * @return 返回正数或负数
 */
Status StrCompare_HeapString(HString *str1, HString *str2) {
    for (int i = 0; i < str1->length && str2->length; i++) {
        /* 遇到不同的字符就直接比较ASCII码 */
        if (str1->ch[i] != str2->ch[i]) {
            return str1->ch[i] - str2->ch[i];
        }

        /* 字符都相等但长度不等,就比较长度 */
        return str1->length - str2->length;
    }
    return OK;
}